#pragma once
#include "mysql.hpp"
#include "chat_session_member-odb.hxx"
#include "log.hpp"

class ChatSessionMemberTable {
public:
    using ptr = std::shared_ptr<ChatSessionMemberTable>;
    ChatSessionMemberTable(const std::shared_ptr<odb::core::database> &db) : _db(db) {}
    // 新增单个聊天会话成员
    bool append(ChatSessionMember csm) {
        try {
            odb::transaction trans(_db->begin());
            _db->persist(csm);
            trans.commit();
        }
        catch(const odb::exception& e) {
            LOG_ERROR("新增单个聊天会话成员失败: {}", e.what());
            return false;
        }
        LOG_INFO("新增单个聊天会话成员成功: chat_session_id={}, user_id={}", csm.chat_session_id(), csm.user_id());
        return true;
    }


    // 批量新增聊天会话成员
    bool append(std::vector<ChatSessionMember> csm_list) {
        try {
            odb::transaction trans(_db->begin());
            for (auto& csm : csm_list) {
                _db->persist(csm);
            }
            trans.commit();
        }
        catch(const odb::exception& e) {
            LOG_ERROR("批量新增聊天会话成员失败: {}", e.what());
            return false;
        }
        LOG_INFO("批量新增聊天会话成员成功: count={}", csm_list.size());
        return true;
    }


    // 删除单个聊天会话成员 通过聊天会话 ID 和用户 ID
    bool remove(const ChatSessionMember& csm) {
        try {
            odb::transaction trans(_db->begin());
            using query_t = odb::query<ChatSessionMember>;
            _db->erase_query<ChatSessionMember>(query_t::chat_session_id == csm.chat_session_id() && 
                                                query_t::user_id == csm.user_id());
            trans.commit();
        }
        catch (const odb::exception& e) {
            LOG_ERROR("删除单个聊天会话成员失败: {}", e.what());
            return false;
        }
        LOG_INFO("删除单个聊天会话成员成功: chat_session_id={}, user_id={}", csm.chat_session_id(), csm.user_id());
        return true;
    }


    // 删除聊天会话中的所有成员 通过聊天会话 ID
    bool remove(const std::string& csid) {
        try {
            odb::transaction trans(_db->begin());
            using query_t = odb::query<ChatSessionMember>;
            _db->erase_query<ChatSessionMember>(query_t::chat_session_id == csid);
            trans.commit();
        }
        catch (const odb::exception& e) {
            LOG_ERROR("删除聊天会话中的所有成员失败: {}", e.what());
            return false;
        }
        LOG_INFO("删除聊天会话中的所有成员成功: chat_session_id={}", csid);
        return true;
    }

    //根据聊天会话 ID 获取所有成员的用户 ID
    std::vector<std::string> members(const std::string& csid) {
        using query_t = odb::query<ChatSessionMember>;
        using result_t = odb::result<ChatSessionMember>;
        std::vector<std::string> members_list;
        result_t res;
        try {
            odb::transaction trans(_db->begin());
            res = _db->query<ChatSessionMember>(query_t::chat_session_id == csid);
            for (const auto& csm : res) {
                members_list.emplace_back(csm.user_id());
            }
            trans.commit();
        }
        catch (const odb::exception& e) {
            LOG_ERROR("获取聊天会话成员失败: {}", e.what());
            return {};
        }
        LOG_INFO("获取聊天会话成员成功: chat_session_id={}, count={}", csid, members_list.size());
        return members_list;
    }
private:
    std::shared_ptr<odb::core::database> _db;
};